import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
    1、JDK5.0之后推出的新特性——泛型
    2、泛型这种语法机制，只在程序编译阶段起作用
    3、使用泛型好处是什么？
        * 集合中的元素类型统一
        * 从集合中取出的元素类型是泛型指定的类型，不需要大量向下转型
    4、缺点：导致集合中储存的元素缺乏多样性

    5、JDK5.0之后推出的新特性——自动类型推断机制

    6、自定义泛型，一般写<E><T>，是个标识符，可以随便写，Element type
        还未确定什么类型，就写<E><T>，类名后可以跟

 */
public class GenericTest01 {
    public static void main(String[] args) {
        //用泛型来指定集合中存储的数据类型
        List<Animal> list = new ArrayList<Animal>();
        //List<Animal> list = new ArrayList<>();   ArrayList集合后面的泛型可以省略不写，使用了自动类型推断机制
        Bird b = new Bird();
        Cat c = new Cat();
        list.add(b);
        list.add(c);

        //获取迭代器，这个表示迭代器迭代的是Animals类型
        Iterator<Animal> it = list.iterator();
        while (it.hasNext()){
            Animal a = it.next();
            a.move();
        }
    }
}

class Animal{

    public void move(){
        System.out.println("动物在移动");
    }

}

class Cat extends Animal{
    public void move(){
        System.out.println("猫在走猫步");
    }

    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }

}

class Bird extends Animal {
    public void move() {
        System.out.println("鸟在飞翔");
    }

    public void fly() {
        System.out.println("鸟会飞");
    }
}
